package com.lcy;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

public class CardInfoDetail extends Activity implements OnClickListener {
	
	private DBManager dbmgr;
	private SQLiteDatabase sdb;	
	private Cursor cursor;
	private Cursor cSpin;	
	private SimpleCursorAdapter sp_adapter;
	private Button date_first;
	private Button date_expire;
	private EditText dmonth_rem;
	EditText dblance;
	private String paramId;
	private String tot_amount;  	 //잔액을 구하기 위한 변수.(납입할 총원금 저장)
	private String tot_month;		 //잔액을 구하기 위한 변수.(할부 총개월수 저장)
	private Calendar calendar = Calendar.getInstance();
	
	private String pur_name = "";			//품명
	private String month_cnt_tot = "";		//총개월수
	private String amount = "";				//품목 금액
	private String firstduedt = "";			//최초 결재일
	private String card_name = "";			//카드명
	private String balance = "";			//잔액 
	private String month_cnt_re = "";		//잔여 개월수
	private String charge_per = "";			//수수료율
	private String expir_date = "";			//만료일
	
	//DatePickerDialog CallbackListener  최초결재일
	DatePickerDialog.OnDateSetListener date_fr = new DatePickerDialog.OnDateSetListener(){
		
		@SuppressWarnings("static-access")
		public void onDateSet(DatePicker view, int year, int monthOfYear, int dateOfmonth){
			calendar.set(Calendar.YEAR, year);
			calendar.set(calendar.MONTH, monthOfYear);
			calendar.set(Calendar.DAY_OF_MONTH, dateOfmonth);
			//frExDateText();			//날짜 세팅
		}
	};
	
	
	
	//DatePickerDialog CallbackListener	만기일
	DatePickerDialog.OnDateSetListener date_ex = new DatePickerDialog.OnDateSetListener(){
		
		@SuppressWarnings("static-access")
		public void onDateSet(DatePicker view, int year, int monthOfYear, int dateOfmonth){
			calendar.set(Calendar.YEAR, year);
			calendar.set(calendar.MONTH, monthOfYear);
			calendar.set(Calendar.DAY_OF_MONTH, dateOfmonth);
			//frExDateText();			//날짜 세팅
		}
	};
	
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.detail_form);
		this.initDB();	//DB초기화
		
		Intent it = getIntent();	
		paramId = it.getStringExtra("seqNo");	//전달받은 intent의 값을 가져온다.
		Toast.makeText(this, "ReceiveValue="+paramId, Toast.LENGTH_SHORT).show();
		
		EditText purnm = (EditText)findViewById(R.id.edit_pur_dname);				//품명
		EditText month_dcnt_tot = (EditText)findViewById(R.id.edit_month_dcnt_tot);	//총개월수
		EditText damount = (EditText)findViewById(R.id.edit_damount);				//총금액
		EditText dorgamount = (EditText)findViewById(R.id.edit_dorgamount); 		//납입원금 	
		EditText dcharge_per = (EditText)findViewById(R.id.edit_dcharge_per);		//수수료율
		dblance = (EditText)findViewById(R.id.edit_dbalance);						//잔액
		dmonth_rem = (EditText)findViewById(R.id.edit_dmonth_cnt_rem);				//남은개월수
		
		dorgamount.setFocusableInTouchMode(false);		//EditTextBox 읽기전용 모드
		
		
		
		//취소버튼
		 Button dbutton_c = (Button)findViewById(R.id.button_dcancel);
		 dbutton_c.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent it = new Intent(CardInfoDetail.this, Lcy10Activity.class);
				startActivity(it);
				finish();	
				
			}
		});
		
		//최초 결재일 클릭 이벤트
		date_first = (Button)findViewById(R.id.edit_dfirst_date);  
		date_first.setOnClickListener(new View.OnClickListener() {
			
			@SuppressWarnings("static-access")
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				new DatePickerDialog(CardInfoDetail.this, date_fr,
						calendar.get(calendar.YEAR),
						calendar.get(calendar.MONTH),
						calendar.get(calendar.DAY_OF_MONTH)).show();
			}
		});
		
		//만기일 클릭 이벤트 
		date_expire = (Button)findViewById(R.id.edit_dexpir_date);  
		date_expire.setOnClickListener(new View.OnClickListener() {
			
			@SuppressWarnings("static-access")
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				new DatePickerDialog(CardInfoDetail.this, date_ex,
						calendar.get(calendar.YEAR),
						calendar.get(calendar.MONTH),
						calendar.get(calendar.DAY_OF_MONTH)).show();
			}
		});
		
		 //삭제버튼
		 Button button_del = (Button)findViewById(R.id.button_del);
		 button_del.setOnClickListener(this);
		 
		 //수정버튼
		 Button button_mod = (Button)findViewById(R.id.button_mod);
		 button_mod.setOnClickListener(this);
		
		int i = 0;  //화면에 나타나는 회원등록 정보 수(데이터의 갯수)
		
		try{
			
			DBManager dbmgr = new DBManager(this);
			
	    	//DB연결
	    	SQLiteDatabase sdb = dbmgr.getReadableDatabase(); //데이타 베이스를 연결해서 읽어오겠다.
			
	    	//쿼리(SQL문) 실행 결과를 Cursor 클래스 로 넘긴다. (항상해야함 순서임.) 커서는 한행씩 데이타를 가져옴
	    	cursor = sdb.rawQuery("select pur_name,month_cnt_tot,amount,firstduedt,card_name,balance,month_cnt_re,charge_per,expir_date from card_info where _id="+paramId, null);
	    	
	    	//cursor 객체를 이용하여 테이블로부터 한 행씩 이동하면서 화면에 출력 
        	while(cursor.moveToNext()){
        		 pur_name = cursor.getString(0);			//품명
        		 month_cnt_tot = cursor.getString(1);		//할부개월	
        		 amount = cursor.getString(2);				//총가격
        		 firstduedt = cursor.getString(3);			//최초결재일
        		 card_name = cursor.getString(4);			//카드사
        		 balance = cursor.getString(5);				//잔액
        		 month_cnt_re = cursor.getString(6);		//잔여개월수
        		 charge_per = cursor.getString(7);			//수수료율
        		 expir_date = cursor.getString(8);			//만기일
        		        		        		    		      		
        		i++;
        	}
        	
        	//detail 화면에 있는 카드사의 값으로 Spinnner을 세팅한다. 
    		Spinner spin = (Spinner)findViewById(R.id.edit_dcard_name);
    		int card_index = 0; //detail화면에서 읽어온 Card Index값을 찾기 위한 변수
    		
    		spin.setPrompt("카드사를 선택하세요");
    		cSpin = sdb.rawQuery("select _id, sub_cd, sub_nm from COMMON_CODE", null);
    		
    		while(cSpin.moveToNext()){
    			
    			if(card_name.equals(cSpin.getString(1))){
    				break;
    			}
    			card_index++;
    		}
    		
    		cSpin.moveToFirst();
    		String[] fromcr = new String[]{"sub_nm","sub_cd"};
    		int[] tocr = new int[]{android.R.id.text1,android.R.id.text2};        		
        	sp_adapter = new SimpleCursorAdapter(
        			this, 
    				android.R.layout.simple_spinner_item, 
    				cSpin, 
    				fromcr, 
    				tocr 
    		);
        	spin.setAdapter(sp_adapter);
        	spin.setSelection(card_index);
        	
        	spin.setOnItemSelectedListener(new OnItemSelectedListener() {

    			@Override
    			public void onItemSelected(AdapterView<?> parent, View view,
    					int position, long id) {
    				// TODO Auto-generated method stub
    				Cursor c;    				
    				c = (Cursor)sp_adapter.getItem(position);		//현재 posion의 Object를 가져온다.
    				
    				card_name = c.getString(1);						//카드사를 선택하면 기존 카드사 name이 변경된다. 
    				
    				//String mes;
    				//mes = "Select Item = " + c.getString(1);	//커서의 값을 가져온다.				
    				//Toast.makeText(CardInfoCreate.this, mes, Toast.LENGTH_SHORT).show();
    				
    			}

    			@Override
    			public void onNothingSelected(AdapterView<?> arg0) {
    				// TODO Auto-generated method stub
    				
    			}
        		
    		});
        	
        	//순서임.
        	cursor.close();
        	dbmgr.close();
        	
        	purnm.setText(pur_name);
        	damount.setText(amount);
        	month_dcnt_tot.setText(month_cnt_tot);
        	
        	if(month_cnt_tot.equals("") || month_cnt_tot.equals(null) ){
        		tot_month = "0";
        	}else{
        		tot_month = month_cnt_tot; //할부 총 개월수를 저장한다. 잔액을 구하기 위함.
        	}
        	
        	if( !(charge_per.equals("0")||charge_per.equals("")) && !(amount.equals("0")||amount.equals("")) ){
        		//납입원금 (총가격 + ( 총가격 * (수수료율/100) ) )
            	BigDecimal dcharge = new BigDecimal(charge_per);								//수수료율
            	BigDecimal div = new BigDecimal("100");											//수수료율을 100%기준으로 환산
            	BigDecimal totalam = new BigDecimal(amount);									//총가격        	
            	BigDecimal result_ch = dcharge.divide(div);										//100%로 환산한 수수료율
            	BigDecimal mult = result_ch.multiply(totalam);									//수수료율 계산 (원금 * 수수료율)
            	BigDecimal totadd = mult.add(totalam).setScale(1, BigDecimal.ROUND_HALF_UP);    //총가격에 수수료율을 더함.(소수점 첫쨰자리 반올림)
            	
            	tot_amount = Integer.toString(totadd.intValue());								//잔액을 구하기 위해 납입원금을 전역변수 세팅
            	dorgamount.setText(  totadd.toBigInteger().toString() ); 						//납부원금 세팅(소수점이하  첫쨰자리 반올리)
        	}else{
        		if( !(charge_per.equals("0")||charge_per.equals("")) && !(amount.equals("0")||amount.equals("")) ){
	        		//총가격은 소수입력이 안됨.그러므로 어느 하나가 0이 입력이 된다면, 수수료를 곱한값은 0이됨.
	        		int totadd = Integer.parseInt(amount)+( Integer.parseInt(amount) * (Integer.parseInt(charge_per)/100) );
	        		tot_amount = Integer.toString(totadd);
	        		dorgamount.setText( Integer.toString(totadd) ); 	
        		}
        	}
        	
        	
        	        	
        	dcharge_per.setText(charge_per);												//수수료율 세팅 	
        	
        	//최초결재일 및 만기일 세팅
        	this.frExDateText(firstduedt, expir_date);
    	
		}catch(SQLiteException e){
			
		}
    	
		
		
	}
	
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		
		if(v.getId() == R.id.button_del){
				
			try{
					sdb.execSQL("delete from CARD_INFO where _id ="+paramId+";");	
					dbmgr.close();
					
					//입력완료 메세지...
					Toast.makeText(this, "DELETE OK!", Toast.LENGTH_SHORT).show();
					//검색화면으로 전환..
					Intent it = new Intent(this, CardInfoSearch.class);
					startActivity(it);
					finish();
						
			}catch(SQLiteException e){
				e.getStackTrace();
			}			
			
		}
		
		if(v.getId() == R.id.button_mod){
			//수정 가능 목록 ( 품명, 총개월 수, 최초결재일, 품목금액, 수수료율, 카드사 
			
			//품명
			EditText pur_nm = (EditText)findViewById(R.id.edit_pur_dname);
			String str_pur_nm = pur_nm.getText().toString();
					
			//총개월수
			EditText tot_month = (EditText)findViewById(R.id.edit_month_dcnt_tot);
			String str_tot_month = tot_month.getText().toString();
			
			//금액
			EditText amount = (EditText)findViewById(R.id.edit_damount);
			String str_amount = amount.getText().toString();
			
			//수수료율
			EditText charge_per = (EditText)findViewById(R.id.edit_dcharge_per);
			String str_charge_per = charge_per.getText().toString();
			
			
			//최초결재일
			String str_first_date = date_first.getText().toString();
			
			try{
				
				sdb.execSQL("\n update CARD_INFO " +
							"\n 	   set pur_name = '"+str_pur_nm+"', "+
							"\n 		   month_cnt_tot = '"+str_tot_month+"', "+
							"\n 		   firstduedt = '"+str_first_date+"', "+
							"\n 		   amount = '"+str_amount+"', "+
							"\n 		   charge_per = '"+str_charge_per+"', "+
							"\n 		   card_name = '"+card_name+"'"	+
							"		  WHERE _id = '"+paramId+"';");
			
				dbmgr.close();
				
				//입력완료 메세지...
				Toast.makeText(this, "MODIFY OK!", Toast.LENGTH_SHORT).show();
				//검색화면으로 전환..
				Intent it = new Intent(this, CardInfoSearch.class);
				startActivity(it);
				finish();
				
			}catch(SQLiteException e){
				e.getStackTrace();
			}	
			
									
			System.out.println("##품명 : "+str_pur_nm);
			System.out.println("##총개월수 : "+str_tot_month);
			System.out.println("##품목 금액 : "+str_amount);
			System.out.println("##최초 결재일 : "+str_first_date);
			System.out.println("##카드명 : "+card_name);
			System.out.println("##수수료율 : "+str_charge_per);

			
		}
		
		
		
	}
	
	//오늘날짜를 구한다
	public void setInitDateText(){
		Date date = calendar.getTime();    
		SimpleDateFormat mDateFormat = new SimpleDateFormat ("yyyy.MM.dd");
    	String strDateTime = mDateFormat.format(date);
    	date_first.setText(strDateTime);	
    	date_expire.setText(strDateTime);				
	}
	
	//Datapicker 최초결재일 및 만기일  세팅시 호출되는 함수
	public void frExDateText(String frdt, String exdt){
		
		// 하루는 86400000 MilliSecond
		
		String[] arrFrdt = null;	//최초결재일 저장 Arr
		String[] arrExdt = null;	//만기일저장  Arr
		
		int month = 0;														//남은개월수를 구함
		int day = 0; 														//남은 일수를 구함
		int month_amount = 0;												//매달 납부금액
		int blamount = 0;													//남은 잔액
		
		
		if(tot_amount != null){
			if( !(tot_amount.equals("0")||tot_amount.equals("")) && !(tot_month.equals("0")||tot_month.equals("")) ){
				//매달납부액 Decimal(소수점까지표현)
				BigDecimal totamount = new BigDecimal( Integer.parseInt(tot_amount)/Integer.parseInt(tot_month) );	
				month_amount = 	totamount.setScale(1, BigDecimal.ROUND_HALF_UP).intValue();		
			}else{
				if(tot_month.equals("0")||tot_month.equals("")){					
					month_amount = Integer.parseInt(tot_amount)/1 ;
				}else{
					month_amount = Integer.parseInt(tot_amount)/Integer.parseInt(tot_month) ;
				}
			}
		}
		
		
		Calendar todate  = Calendar.getInstance();
		Calendar fr_date = Calendar.getInstance();
		Calendar ex_date = Calendar.getInstance();
		
		Date frdt_frm = null;
		Date exdt_frm = null;
		
		arrFrdt = frdt.split("[.]");
		arrExdt = exdt.split("[.]");
		
		//날짜 split의 값은 항상 3이다 2011.01.01 형식이므로 아니면 에러.
		if(arrFrdt.length == 3 && arrExdt.length == 3 ){
			fr_date.set(Integer.parseInt(arrFrdt[0]), Integer.parseInt(arrFrdt[1])-1, Integer.parseInt(arrFrdt[2]));
			ex_date.set(Integer.parseInt(arrExdt[0]), Integer.parseInt(arrExdt[1])-1, Integer.parseInt(arrExdt[2]));
			
			day = (int) ((ex_date.getTimeInMillis()-todate.getTimeInMillis())/86400000);  
			
			if(day >= 30){ //한달 이상이면 남은 달수를 구한다. 	
				month = day/30; 
			}
			
			if(month > 0){
				for(int i = 0 ; i < month ; i++ ){
					blamount += month_amount;
				}
			}
						
			frdt_frm = fr_date.getTime();
			exdt_frm = ex_date.getTime();
			
		}else{
			//화면에 다이얼로그 뿌려줌.
	    	AlertDialog.Builder alert = new AlertDialog.Builder(CardInfoDetail.this);
	    	alert.setTitle("알림창");
	    	alert.setMessage("날짜 형식이 잘못 되었습니다.");
	    	alert.setIcon(R.drawable.icon);
	    	alert.setPositiveButton("확인", null);
	    	alert.show();
		}		
		
		
		
		SimpleDateFormat mDateFormat = new SimpleDateFormat ("yyyy.MM.dd");
    	String frDateTime = mDateFormat.format(frdt_frm);
    	String exDateTime = mDateFormat.format(exdt_frm);
    	
    	date_first.setText(frDateTime);					//최초결재일
    	date_expire.setText(exDateTime);				//만기일 
    	dmonth_rem.setText(Integer.toString(month));	//남은개월수
    	dblance.setText(Integer.toString(blamount));	//잔액
	}
	
	//DB 초기화 및 생성 
	public void initDB(){
		dbmgr = new DBManager(this);		
		sdb = dbmgr.getWritableDatabase();
	}

}
